// 题目三：8 选 1 多路选择器设计
// 请用 Verilog 实现一个 8 选 1 多路选择器：
// 2
// 1
// module mux8to1 (
// 2
// input wire [7:0] data_in ,
// 3
// input wire [2:0] sel ,
// 4
// output wire data_out
// 5
// );
// Listing 3: 8 选 1 选择器模块接口
// • 使用 case 语句实现选择逻辑；
// • 编写测试模块验证选择器行为；
// • 在报告中解释各 sel 值对应的输出行为。



module mux8to1(
    input wire [7:0] data_in,
    input wire [2:0] sel,
    output wire data_out
);

    //实现一个函数 使用case语句实现选择逻辑
    function tmp_out;
        input [7:0] tmp_in;
        input [2:0] tmp_sel;
        case(tmp_sel)
            3'b000: tmp_out = tmp_in[0];
            3'b001: tmp_out = tmp_in[1];
            3'b010: tmp_out = tmp_in[2];
            3'b011: tmp_out = tmp_in[3];
            3'b100: tmp_out = tmp_in[4];
            3'b101: tmp_out = tmp_in[5];
            3'b110: tmp_out = tmp_in[6];
            3'b111: tmp_out = tmp_in[7];

        endcase

    endfunction

    assign data_out = tmp_out(data_in, sel);
endmodule


`timescale 1ns/100ps
//testbench of mux8to1
module mux8to1_tb;
    reg[7:0] data_in;
    reg [2:0] sel;
    wire data_out;

    mux8to1 mux8to1(
        .data_in(data_in),
        .sel(sel),
        .data_out(data_out)
    );

    initial begin
        data_in = 8'b10011101;
        sel = 3'b000;
    #10 sel = 3'b001;
    #10 sel = 3'b010;
    #10 sel = 3'b011;
    #10 sel = 3'b100;
    #10 sel = 3'b101;
    #10 sel = 3'b110;
    #10 sel = 3'b111;
    #10 $stop;
    end
endmodule